
%{
#include <stdio.h>
#include <math.h>
#include "tabelas.c"

char reservadas[26][30];
simbo sim;
simbo *tab_sim;
char tab_tipo[N_TIPOS][MAX_TAM_TIPOS];
int n = 0;
int numTipos = 2;
int tag = 0;
int pal_reser = 0;

%}
REAL [0-9]+.[0-9]+
INTEIRO [0-9]
NUMMALFORMINT [0-9]+[a-zA-Z]
NUMMALFORMREAL [0-9][a-zA-Z]*.[0-9]*[a-zA-Z]
IDENT [a-zA-Z][a-zA-Z0-9]*
ESPACO [" "\t]
LINHA [\n\r]
OUTROS [a-zA-Z0-9]*[!@#$%¨&´`^~ªº\|£¢¬°§áàâãûüóòõô]*[a-zA-Z0-9]*
%%
"."		{ if(coment != 1) {return (".", PONTO);}}


"="		{ if(coment != 1) {return ("=", IGUAL);}}

"<>"		{ if(coment != 1) {return ("<>",DIFERENTE); }}

">"		{ if(coment != 1) {return (">", MAIOR);}}

"<"		{ if(coment != 1) {return ("<", MENOR) ;}}

">="		{ if(coment != 1) {return (">=", MAIOR_IGUAL);}}

"<="		{ if(coment != 1) {return ("<=", MENOR_IGUAL);}}

":="		{ if(coment != 1) {return (":=", ATRIBUICAO);}}

";"		{ if(coment != 1) {return (";", PONTO_VIRGULA);}}

":"		{ if(coment != 1) {tag = 3; return (":", DOIS_PONTOS);}}

","		{ if(coment != 1) {return (",", VIRGULA);} return COMENTARIO;}

"("		{ if(coment != 1) { return ("(", ABRE_PARANTESES);}}

")"		{ if(coment != 1) {return (")", FECHA_PARANTESES); }}

"{"		{  coment = 1; }

"}"		{  coment = 0;}

"+"		{ if(coment != 1) {return ("+",SINAL_MAIS);}}

"-"		{ if(coment != 1) {return ("-", SINAL_MENOS);}}

"*"		{ if(coment != 1) {return ("*", SINAL_MULTI);}}

"/"		{ if(coment != 1) {return ("/", SINAL_DIV);}}

{ESPACO}+	{continue;}

{LINHA}		{ linhas++;}

{INTEIRO}+	{ if(coment != 1){return INTEGER;}}

{REAL}+		{ if(coment != 1) {return REAL;}}


{NUMMALFORMINT}+ { if(coment != 1){ printf("%s - Erro: numero mal formado - linha %d\n", yytext, linhas); return (yytext, ERRO_CADEIA_INVA);}}

{NUMMALFORMREAL}+ { if(coment != 1){ printf("%s - Erro: numero mal formado - linha %d\n", yytext, linhas); return (yytext, ERRO_CADEIA_INVA);}}

{IDENT}		{ 
		  sim.id = yytext;

		  if(coment == 1){
			}
		  else
		  if(tag == 3){
			tag = 0;
			
			int id = buscaTipo(tab_tipo, sim.id, numTipos);
			if(id == 0){
				return(yytext, INTEGER);
			}
			else
			if(id == 1){
				return(yytext, REAL);
			}
			else{
				return (yytext, -1);				
				}
			
		  }
		  else{
		  	if(buscaPalavraReservada(reservadas, sim, &tag, &pal_reser)){
		  		switch (pal_reser){
					case 1: return (yytext, PBEGIN);
						break;
					case 2: return (yytext, CONST);
						break;
					case 3: return (yytext, DO);
						break;
					case 4: return (yytext, ELSE);
						break;
					case 5: return (yytext, END);
						break;
					case 8: return (yytext, IF);
						break;
					case 9: return (yytext, INTEGER);
						break;
					case 16: return (yytext, PROGRAM);
						break;
					case 17: return (yytext, PROCEDURE);
						break;
					case 18: return (yytext, REAL);
						break;
					case 19: return (yytext, REPEAT);
						break;
					case 20: return (yytext, READLN);
						break;
					case 21: return (yytext, THEN);
						break;
					case 22: return (yytext, UNTIL);
						break;
					case 23: return (yytext, VAR);
						break;
					case 24: return (yytext, WHILE);
						break;
					case 25: return (yytext, WRITELN);
						break;
					default: return (yytext, -1);
				}
				return (yytext, -1);
				
				}
		  else
			if(strlen(sim.id) > MAX_TAM_VAR){
				printf("%s - Erro: identificador muito grande - linha %d\n", yytext, linhas);
				return (yytext, ERRO_IDENT_GRANDE); }
		  
		  return (yytext, IDENT);
		}
		}	
{OUTROS}	{  if(coment == 1){
				} 
				else 
					printf("%s - Erro: cadeia Inválida - linha %d\n", yytext, linhas);   return (yytext, ERRO_CADEIA_INVA);
			}		
%%
	
